package com.hjtech.baselib.utils

import android.content.Context
import java.io.BufferedReader
import java.io.File
import java.io.FileInputStream
import java.io.InputStreamReader

/*
 * 文件名:    SharePreUtils
 * 创建者:    ZSY
 * 创建时间:  2016/12/12 on 11:58
 * 描述:     SharedPreferences存取工具类
 */

object SharePreUtils {

    //配置文件，文件名
    val SHARE_NAME = "user_info"

    /**
     * 万能put
     *
     * @param mContext
     * @param key
     * @param values
     */
    fun put(mContext: Context, key: String, values: Any?) {
        if (values is String) {
            putString(mContext, key, (values as String?)!!)
        } else if (values is Int) {
            putInt(mContext, key, (values as Int?)!!)
        } else if (values is Boolean) {
            putBoolean(mContext, key, (values as Boolean?)!!)
        } else {
            //出去上面三个类型，都存储为String
            putString(mContext, key, values.toString())
        }

    }

    /**
     * 存字符串
     *
     * @param mContext 上下文
     * @param key      键
     * @param values   值
     */
    fun putString(mContext: Context, key: String, values: String) {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        sp.edit().putString(key, values).commit()
    }


    /**
     * 取字符串
     *
     * @param mContext 上下文
     * @param key      键
     * @param values   默认值
     * @return 取出的值
     */
    fun getString(mContext: Context, key: String, values: String): String? {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        return sp.getString(key, values)
    }


    /**
     * 存布尔值
     *
     * @param mContext 上下文
     * @param key      键
     * @param values   值
     */
    fun putBoolean(mContext: Context, key: String, values: Boolean) {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        sp.edit().putBoolean(key, values).commit()
    }

    /**
     * 取布尔值
     *
     * @param mContext 上下文
     * @param key      键
     * @param values   默认值
     * @return true/false
     */
    fun getBoolean(mContext: Context, key: String, values: Boolean): Boolean {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        return sp.getBoolean(key, values)
    }

    /**
     * 存int值
     *
     * @param mContext 上下文
     * @param key      键
     * @param values   值
     */
    fun putInt(mContext: Context, key: String, values: Int) {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        sp.edit().putInt(key, values).commit()
    }

    /**
     * 取int值
     *
     * @param mContext 上下文
     * @param key      键
     * @param values   默认值
     * @return
     */
    fun getInt(mContext: Context, key: String, values: Int): Int {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        return sp.getInt(key, values)
    }

    /**
     * 删除一条字段
     *
     * @param mContext 上下文
     * @param key      键
     */
    fun deleShare(mContext: Context, key: String) {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        //单个清理
        sp.edit().remove(key).commit()
    }

    /**
     * 删除全部数据
     *
     * @param mContext 上下文
     */
    fun deleShareAll(mContext: Context) {
        val sp = mContext.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE)
        //全部清理
        sp.edit().clear().commit()
    }

    /**
     * 查看SharedPreferences的内容
     */
    fun lookSharePre(context: Context): String {
        try {
            val stream = FileInputStream(File("/data/data/" +
                    context.packageName + "/shared_prefs", SHARE_NAME + ".xml"))
            val bff = BufferedReader(InputStreamReader(stream))
            var line: String = bff.readLine()
            val sb = StringBuilder()
            while (line != null) {
                sb.append(line)
                sb.append("\n")
            }
            return sb.toString()
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return "未找到当前配置文件！"
    }


    /**
     * 将bean对象的字段和值添加到sp中
     *
     * @param object
     */
    fun addSp(context: Context, `object`: Any?) {
        if (`object` == null) {
            return
        }
        val fields = `object`.javaClass.declaredFields
        for (field in fields) {
            field.isAccessible = true
            var value: Any? = null
            try {
                value = field.get(`object`)
            } catch (e: IllegalAccessException) {
                e.printStackTrace()
            }

            val name = field.name
            put(context, name, value)
        }
    }
}